Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / NomadNet.git / files / nomadnet / NomadNetworkApp.py

Displaying Raw • Download


nomadnet/NomadNetworkApp.py 9e8d5fa96048def667f7dc47fee253c9861a49a2 (9e8d5fa9) Text, 59.09 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787io
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787shlex
Tff7b72import T7ee787atexit
Tff7b72import T7ee787threading
Tff7b72import T7ee787traceback
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787contextlib

Tff7b72import T7ee787RNS
Tff7b72import T7ee787LXMF
Tff7b72import T7ee787nomadnet

Tff7b72from T7ee787nomadnetT7ee787.T7ee787Directory Tff7b72import Te6edf3DirectoryEntry
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime

Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack

Tff7b72from T7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj

Tff7b72class T56d364NomadNetworkAppTb4b4b4:
Te6edf3time_format Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"
Te6edf3_shared_instance Tff7b72= Tff7b72None

Te6edf3userdir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Ta5d6ff"Ta5d6ff/etc/nomadnetworkTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Ta5d6ff"Ta5d6ff/etc/nomadnetwork/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Ta5d6ff"Ta5d6ff/etc/nomadnetworkTa5d6ff"
Tff7b72elif Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3userdirTff7b72+Ta5d6ff"Ta5d6ff/.config/nomadnetworkTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3userdirTff7b72+Ta5d6ff"Ta5d6ff/.config/nomadnetwork/configTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3userdirTff7b72+Ta5d6ff"Ta5d6ff/.config/nomadnetworkTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3configdir Tff7b72= Te6edf3userdirTff7b72+Ta5d6ff"Ta5d6ff/.nomadnetworkTa5d6ff"

Te6edf3START_ANNOUNCE_DELAY Tff7b72= T79c0ff3

Tff7b72def Td2a8ffexit_handlerTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run_jobs Tff7b72= Tff7b72False

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSaving directory...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffsave_to_diskTb4b4b4(Tb4b4b4)

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTb4b4b4, Ta5d6ff"Ta5d6ffrrcTa5d6ff"Tb4b4b4) Tff7b72and Tff7b72selfTff7b72.Td2a8ffrrc Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrrcTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrrcTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuiTb4b4b4, Ta5d6ff"Ta5d6ffrestore_ixonTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuiTff7b72.Td2a8ffrestore_ixonTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3osTff7b72.Td2a8ffsystemTb4b4b4(Ta5d6ff"Ta5d6ffstty ixonTa5d6ff"Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not restore flow control sequences. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72if Tffa657hasattrTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuiTb4b4b4, Ta5d6ff"Ta5d6ffrestore_paletteTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuiTff7b72.Td2a8ffrestore_paletteTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuiTff7b72.Td2a8ffscreenTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\x1bTa5d6ff]104Tffea00\x07Ta5d6ff"Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not restore terminal color palette. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNomad Network Client exiting nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72def Td2a8ffexception_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3e_typeTb4b4b4, Te6edf3e_valueTb4b4b4, Te6edf3e_tracebackTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn unhandled exception occurred, the details of which will be dumped belowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffType : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3e_typeTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffValue : Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3e_valueTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3t_string Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3line Tff7b72in Te6edf3tracebackTff7b72.Td2a8ffformat_tbTb4b4b4(Te6edf3e_tracebackTb4b4b4)Tb4b4b4:
Te6edf3t_string Tff7b72+Tff7b72= Te6edf3line
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffTrace : Tffea00\nTa5d6ff"Tff7b72+Te6edf3t_stringTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Tffa657issubclassTb4b4b4(Te6edf3e_typeTb4b4b4, Tf85149KeyboardInterruptTb4b4b4)Tb4b4b4:
Te6edf3sysTff7b72.Td2a8ff__excepthook__Tb4b4b4(Te6edf3e_typeTb4b4b4, Te6edf3e_valueTb4b4b4, Te6edf3e_tracebackTb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3configdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3rnsconfigdir Tff7b72= Tff7b72NoneTb4b4b4, Te6edf3daemon Tff7b72= Tff7b72FalseTb4b4b4, Te6edf3force_console Tff7b72= Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffversion Tff7b72= Te6edf3__version__
Tff7b72selfTff7b72.Td2a8ffenable_client Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72= T79c0ff6Tff7b72*T79c0ff60Tff7b72*T79c0ff60

Tff7b72if Te6edf3configdir Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3NomadNetworkAppTff7b72.Td2a8ffconfigdir
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigdir Tff7b72= Te6edf3configdir

Tff7b72if Te6edf3force_consoleTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffforce_console_log Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffforce_console_log Tff7b72= Tff7b72False

Tff7b72if Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72= Tff7b72self

Tff7b72selfTff7b72.Td2a8ffrns Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3rnsconfigdirTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffconfigpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/configTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffignoredpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/ignoredTa5d6ff"
Tff7b72selfTff7b72.Td2a8fflogfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/logfileTa5d6ff"
Tff7b72selfTff7b72.Td2a8fferrorfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/errorsTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffpnannouncedpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/pnannouncedTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffstoragepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storageTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffidentitypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/identityTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffcachepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/cacheTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffresourcepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/resourcesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/conversationsTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffdirectorypath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/directoryTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffpeersettingspath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/peersettingsTa5d6ff"
Tff7b72selfTff7b72.Td2a8fftmpfilespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/tmpTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffattachmentpath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/attachmentsTa5d6ff"

Tff7b72selfTff7b72.Td2a8ffpagespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/pagesTa5d6ff"
Tff7b72selfTff7b72.Td2a8fffilespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/filesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffcachepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/storage/cacheTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffexamplespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/examplesTa5d6ff"

Tff7b72selfTff7b72.Td2a8ffdownloads_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Ta5d6ff"Ta5d6ff~/DownloadsTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffattachment_save_path Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8fffirstrun Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffshould_run_jobs Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffjob_interval Tff7b72= T79c0ff5
Tff7b72selfTff7b72.Td2a8ffdefer_jobs Tff7b72= T79c0ff90
Tff7b72selfTff7b72.Td2a8ffpage_refresh_interval Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fffile_refresh_interval Tff7b72= T79c0ff0

Tff7b72selfTff7b72.Td2a8ffstatic_peers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_start Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffdisable_propagation Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffnotify_on_new_message Tff7b72= Tff7b72True

Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_size Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflxmf_max_sync_size Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fflxmf_max_incoming_size Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnode_propagation_cost Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPROPAGATION_COST

Tff7b72selfTff7b72.Td2a8ffperiodic_lxmf_sync Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflxmf_sync_interval Tff7b72= T79c0ff360Tff7b72*T79c0ff60
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= T79c0ff8
Tff7b72selfTff7b72.Td2a8ffcompact_stream Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffrequired_stamp_cost Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffaccept_invalid_stamps Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffrrc_history_per_room_cap Tff7b72= T79c0ff500


Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresourcepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffresourcepathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagespathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpagespathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fffilespathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8fffilespathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcachepathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fftmpfilespathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8fftmpfilespathTb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffattachmentpathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffattachmentpathTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffclear_tmp_dirTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffapplyConfigTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe configuration file is invalid. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffConfiguration loaded from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not parse the configuration at Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffconfigpathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCheck your configuration file for errors!Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffexamplespathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72import T7ee787shutil
Te6edf3examplespath Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffdirnameTb4b4b4(Tff7b72__file__Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffexamplesTa5d6ff"Tb4b4b4)
Te6edf3shutilTff7b72.Td2a8ffcopytreeTb4b4b4(Te6edf3examplespathTb4b4b4, Tff7b72selfTff7b72.Td2a8ffexamplespathTb4b4b4, Te6edf3ignoreTff7b72=Te6edf3shutilTff7b72.Td2a8ffignore_patternsTb4b4b4(Ta5d6ff"Ta5d6ff__pycache__Ta5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not copy examples into the Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffexamplespathTff7b72+Ta5d6ff"Ta5d6ff directory.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load config file, creating default configuration file...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcreateDefaultConfigTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fffirstrun Tff7b72= Tff7b72True

Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLoaded Primary Identity Tffd700%sTa5d6ff from Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not load the Primary Identity from Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo Primary Identity file found, creating new...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentitypathTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new Primary Identity Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new Primary IdentityTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0

Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_interval

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not load local peer settings from Tffd700{Tff7b72selfTff7b72.Td2a8ffpeersettingspathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThis likely means that the peer settings file has become corrupt.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffYou can try deleting the file at Tffd700{Tff7b72selfTff7b72.Td2a8ffpeersettingspathTffd700}Ta5d6ff and restarting nomadnet.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo peer settings file found, creating new...Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAnonymous PeerTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounce_intervalTb4b4b4,
Ta5d6ff"Ta5d6fflast_announceTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffnode_last_announceTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffnode_connectsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffserved_page_requestsTa5d6ff"Tb4b4b4: T79c0ff0Tb4b4b4,
Ta5d6ff"Ta5d6ffserved_file_requestsTa5d6ff"Tb4b4b4: T79c0ff0
Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCreated new peer settings fileTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not create and save a new peer settings fileTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Tffd700%sTa5d6ff" Tff7b72% Tb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3nomadnetTff7b72.Td2a8ffpanicTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffignored_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffignoredpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3fh Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffignoredpathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3ignored_input Tff7b72= Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fhTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Te6edf3ignored_hash_strs Tff7b72= Te6edf3ignored_inputTff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)

Tff7b72for Te6edf3hash_str Tff7b72in Te6edf3ignored_hash_strsTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_strTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3ignored_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3hash_strTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffignored_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3ignored_hashTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not decode RNS Identity hash from: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hash_strTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while loading list of ignored destinations: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffDirectoryTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72from T7ee787nomadnetT7ee787.T7ee787RRC Tff7b72import Te6edf3RRCManager
Tff7b72selfTff7b72.Td2a8ffrrc Tff7b72= Te6edf3RRCManagerTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrrcTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)

Te6edf3static_peers Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3static_peer Tff7b72in Tff7b72selfTff7b72.Td2a8ffstatic_peersTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dh Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3static_peerTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dhTb4b4b4) Tff7b72!= Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination lengthTa5d6ff"Tb4b4b4)
Te6edf3static_peersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3dhTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not decode static peer destination hash Tffd700{Te6edf3static_peerTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffmessage_router Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTb4b4b4(
Te6edf3identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3storagepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffstoragepathTb4b4b4, Te6edf3autopeer Tff7b72= Tff7b72TrueTb4b4b4,
Te6edf3propagation_limit Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_sizeTb4b4b4, Te6edf3sync_limit Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_max_sync_sizeTb4b4b4, Te6edf3delivery_limit Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_max_incoming_sizeTb4b4b4,
Te6edf3max_peers Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_peersTb4b4b4, Te6edf3static_peers Tff7b72= Te6edf3static_peersTb4b4b4, Te6edf3propagation_costTff7b72=Tff7b72selfTff7b72.Td2a8ffnode_propagation_cost
Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_deliveryTb4b4b4)

Tff7b72for Te6edf3destination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffignored_listTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffignore_destinationTb4b4b4(Te6edf3destination_hashTb4b4b4)

Tff7b72selfTff7b72.Td2a8fflxmf_destination Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffregister_delivery_identityTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3display_nameTff7b72=Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3stamp_costTff7b72=Tff7b72selfTff7b72.Td2a8ffrequired_stamp_costTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffaccept_invalid_stampsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffenforce_stampsTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTb4b4b4(
Te6edf3packet_hashTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3destination_hashTff7b72=Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3public_keyTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffget_public_keyTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3app_dataTff7b72=Tff7b72None
Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Router ready to receive on: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffenable_nodeTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_message_storage_limitTb4b4b4(Te6edf3megabytesTff7b72=Tff7b72selfTff7b72.Td2a8ffmessage_storage_limitTb4b4b4)
Tff7b72for Te6edf3dest_str Tff7b72in Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinationsTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3dest_strTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3dest_hashTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffprioritiseTb4b4b4(Te6edf3dest_hashTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCannot prioritise Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3dest_strTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, it is not a valid destination hashTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffdisable_propagationTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpnannouncedpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending indication to peered LXMF Propagation Node that this node is no longer participatingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdisable_propagationTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpnannouncedpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while indicating that this LXMF Propagation Node is no longer participating. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffenable_propagationTb4b4b4(Tb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpnannouncedpathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3pnfTb4b4b4:
Te6edf3pnfTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3pnfTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while writing Propagation Node announce timestamp. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdisable_propagationTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffLXMF Propagation Node started on: Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_destinationTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffnode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffNodeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode Tff7b72= Tff7b72None
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpnannouncedpathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending indication to peered LXMF Propagation Node that this node is no longer participatingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffdisable_propagationTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpnannouncedpathTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error ocurred while indicating that this LXMF Propagation Node is no longer participating. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffConversationTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffregister_announce_handlerTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffDirectoryTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_startTb4b4b4:
Tff7b72def Td2a8ffdelayed_announceTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3NomadNetworkAppTff7b72.Td2a8ffSTART_ANNOUNCE_DELAYTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)

Te6edf3da_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3delayed_announceTb4b4b4)
Te6edf3da_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3da_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Tff7b72selfTff7b72.Td2a8ffexit_handlerTb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexcepthook Tff7b72= Tff7b72selfTff7b72.Td2a8ffexception_handler

Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ff__jobsTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffsetDaemonTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

T8b949e# Override UI choice from config on --daemon switch
Tff7b72if Te6edf3daemonTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_NONE

T8b949e# This stderr redirect is needed to stop urwid
T8b949e# from spewing KeyErrors to the console and thus,
T8b949e# messing up the UI. A pull request to fix the
T8b949e# bug in urwid was submitted, but until it is
T8b949e# merged, this hack will mitigate it.
Te6edf3strio Tff7b72= Te6edf3ioTff7b72.Td2a8ffStringIOTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffredirect_stderrTb4b4b4(Te6edf3strioTb4b4b4)Tb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffspawnTb4b4b4(Tff7b72selfTff7b72.Td2a8ffuimodeTb4b4b4)

Tff7b72if Te6edf3strioTff7b72.Td2a8fftellTb4b4b4(Tb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3strioTff7b72.Td2a8ffseekTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3err_file Tff7b72= Tffa657openTb4b4b4(Tff7b72selfTff7b72.Td2a8fferrorfilepathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4)
Te6edf3err_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3strioTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3err_fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not write stderr output to error log file at Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8fferrorfilepathTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)


Tff7b72def Td2a8ff__jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDeferring scheduled jobs for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdefer_jobsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdefer_jobsTb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting job scheduler nowTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72while Tff7b72selfTff7b72.Td2a8ffshould_run_jobsTb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8fflxmf_sync_intervalTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInitiating automatic LXMF syncTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrequest_lxmf_syncTb4b4b4(Te6edf3limitTff7b72=Tff7b72selfTff7b72.Td2a8fflxmf_sync_limitTb4b4b4)

Tff7b72if Te6edf3now Tff7b72> Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_announceTa5d6ff"Tb4b4b4] Tff7b72+ Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffjob_intervalTb4b4b4)

Tff7b72def Td2a8ffset_display_nameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3display_nameTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3display_name
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffdisplay_name Tff7b72= Te6edf3display_name
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_display_nameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ffget_display_name_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffget_sync_statusTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffIdleTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffPath requestedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffEstablishing linkTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffLink establishedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSync request sentTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffReceiving messagesTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffMessages receivedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_NO_PATHTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffNo path to nodeTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_FAILEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffLink establisment failedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_TRANSFER_FAILEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSync request failedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_NO_IDENTITY_RCVDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffRemote got no identityTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_NO_ACCESSTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffNode rejected requestTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_FAILEDTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffSync failedTa5d6ff"
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Te6edf3new_msgs Tff7b72= Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_last_result
Tff7b72if Te6edf3new_msgs Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDone, no new messagesTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffDownloaded Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3new_msgsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff new messagesTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffUnknownTa5d6ff"

Tff7b72def Td2a8ffsync_status_show_percentTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_PATH_REQUESTEDTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHINGTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_LINK_ESTABLISHEDTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_REQUEST_SENTTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RECEIVINGTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_RESPONSE_RECEIVEDTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Tff7b72return Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffget_sync_progressTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_progress

Tff7b72def Td2a8ffrequest_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3limit Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLE Tff7b72or Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72>Tff7b72= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_COMPLETETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_lxmf_syncTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffrequest_messages_from_propagation_nodeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3max_messages Tff7b72= Te6edf3limitTb4b4b4)

Tff7b72def Td2a8ffcancel_lxmf_syncTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffpropagation_transfer_state Tff7b72!= Te6edf3LXMFTff7b72.Td2a8ffLXMRouterTff7b72.Td2a8ffPR_IDLETb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffcancel_propagation_node_requestsTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffannounce_nowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSending lxmf.delivery announceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_inbound_stamp_costTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4, Tff7b72selfTff7b72.Td2a8ffrequired_stamp_costTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffdisplay_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffdisplay_nameTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffannounceTb4b4b4(Tff7b72selfTff7b72.Td2a8fflxmf_destinationTff7b72.Td2a8ffhashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6fflast_announceTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffautoselect_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3selected_node Tff7b72= Tff7b72None

Tff7b72if Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settings Tff7b72and Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4] Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3selected_node Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3nodes Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffknown_nodesTb4b4b4(Tb4b4b4)
Te6edf3trusted_nodes Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3best_hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATHFINDER_MTff7b72+T79c0ff1

Tff7b72for Te6edf3node Tff7b72in Te6edf3nodesTb4b4b4:
Tff7b72if Te6edf3nodeTff7b72.Td2a8fftrust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4:
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffsource_hashTb4b4b4)

Tff7b72if Te6edf3hops Tff7b72< Te6edf3best_hopsTb4b4b4:
Te6edf3best_hops Tff7b72= Te6edf3hops
Te6edf3selected_node Tff7b72= Te6edf3nodeTff7b72.Td2a8ffsource_hash

Tff7b72if Te6edf3selected_node Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not autoselect a propagation node! LXMF propagation will not be available until a trusted node announces on the network, or a propagation node is manually selected.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3pn_name_str Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSelecting Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3selected_nodeTb4b4b4)Tff7b72+Te6edf3pn_name_strTff7b72+Ta5d6ff"Ta5d6ff as default LXMF propagation nodeTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffset_outbound_propagation_nodeTb4b4b4(Te6edf3selected_nodeTb4b4b4)

Tff7b72def Td2a8ffget_user_selected_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffset_user_selected_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_hashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_nodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3node_hash
Tff7b72selfTff7b72.Td2a8ffsave_peer_settingsTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffautoselect_propagation_nodeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffget_default_propagation_nodeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffmessage_routerTff7b72.Td2a8ffget_outbound_propagation_nodeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffsave_peer_settingsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3tmp_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffpeersettingspathTffd700}Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmp_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4: Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_settingsTb4b4b4)Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmp_pathTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpeersettingspathTb4b4b4)

Tff7b72def Td2a8fflxmf_deliveryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Te6edf3time_string Tff7b72= Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3messageTff7b72.Td2a8fftimestampTb4b4b4)Tb4b4b4)
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffSignature is invalid, reason undeterminedTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffsignature_validatedTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffValidatedTa5d6ff"
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSIGNATURE_INVALIDTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffInvalid signatureTa5d6ff"
Tff7b72if Te6edf3messageTff7b72.Td2a8ffunverified_reason Tff7b72== Te6edf3LXMFTff7b72.Td2a8ffLXMessageTff7b72.Td2a8ffSOURCE_UNKNOWNTb4b4b4:
Te6edf3signature_string Tff7b72= Ta5d6ff"Ta5d6ffCannot verify, source is unknownTa5d6ff"

Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffingestTb4b4b4(Te6edf3messageTb4b4b4, Tff7b72selfTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffnotify_on_new_messageTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnotify_message_recievedTb4b4b4(Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffshould_printTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_messageTb4b4b4(Te6edf3messageTb4b4b4)

Tff7b72def Td2a8ffshould_printTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprint_messagesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffprint_all_messagesTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4:
Te6edf3source_hash_text Tff7b72= Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3messageTff7b72.Td2a8ffsource_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffprint_trusted_messagesTb4b4b4:
Te6edf3trust_level Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8fftrust_levelTb4b4b4(Te6edf3messageTff7b72.Td2a8ffsource_hashTb4b4b4)
Tff7b72if Te6edf3trust_level Tff7b72== Te6edf3DirectoryEntryTff7b72.Td2a8ffTRUSTEDTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinationsTb4b4b4) Tff7b72is Tffa657listTb4b4b4:
Tff7b72if Te6edf3source_hash_text Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinationsTb4b4b4:
Tff7b72return Tff7b72True

Tff7b72return Tff7b72False

Tff7b72def Td2a8ffprint_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3filenameTb4b4b4)Tb4b4b4:
Te6edf3print_command Tff7b72= Tff7b72selfTff7b72.Td2a8ffprint_commandTff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Te6edf3filename

Tff7b72tryTb4b4b4:
Te6edf3return_code Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffcallTb4b4b4(Te6edf3shlexTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3print_commandTb4b4b4)Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffDEVNULLTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAn error occurred while executing print command: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3print_commandTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False

Tff7b72if Te6edf3return_code Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSuccessfully printed Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3filenameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff using print command: Ta5d6ff"Tff7b72+Te6edf3print_commandTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72True

Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPrinting Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3filenameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff failed using print command: Ta5d6ff"Tff7b72+Te6edf3print_commandTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72False


Tff7b72def Td2a8ffprint_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3messageTb4b4b4, Te6edf3received Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3template Tff7b72= Tff7b72selfTff7b72.Td2a8ffprinting_template_msg

Tff7b72if Te6edf3received Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3received Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffuiTff7b72.Td2a8ffglyphs

Te6edf3m_rtime Tff7b72= Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3messageTff7b72.Td2a8fftimestampTb4b4b4)
Te6edf3stime Tff7b72= Te6edf3m_rtimeTff7b72.Td2a8ffstrftimeTb4b4b4(Tff7b72selfTff7b72.Td2a8fftime_formatTb4b4b4)

Te6edf3message_time Tff7b72= Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3receivedTb4b4b4)
Te6edf3rtime Tff7b72= Te6edf3message_timeTff7b72.Td2a8ffstrftimeTb4b4b4(Tff7b72selfTff7b72.Td2a8fftime_formatTb4b4b4)

Te6edf3display_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffsimplest_display_strTb4b4b4(Te6edf3messageTff7b72.Td2a8ffsource_hashTb4b4b4)
Te6edf3title Tff7b72= Te6edf3messageTff7b72.Td2a8fftitle_as_stringTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3title Tff7b72== Ta5d6ff"Ta5d6ff"Tb4b4b4:
Te6edf3title Tff7b72= Ta5d6ff"Ta5d6ffNoneTa5d6ff"

Te6edf3output Tff7b72= Te6edf3templateTff7b72.Td2a8ffformatTb4b4b4(
Te6edf3originTff7b72=Te6edf3display_nameTb4b4b4,
Te6edf3stimeTff7b72=Te6edf3stimeTb4b4b4,
Te6edf3rtimeTff7b72=Te6edf3rtimeTb4b4b4,
Te6edf3mtitleTff7b72=Te6edf3titleTb4b4b4,
Te6edf3mbodyTff7b72=Te6edf3messageTff7b72.Td2a8ffcontent_as_stringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3filename Tff7b72= Ta5d6ff"Ta5d6ff/tmp/Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3outputTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3filenameTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3outputTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3fTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffprint_fileTb4b4b4(Te6edf3filenameTb4b4b4)

Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3filenameTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while printing incoming LXMF message. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)

Tff7b72def Td2a8ffconversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffconversation_listTb4b4b4(Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffhas_unread_conversationsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffconversation_is_unreadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72in Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4:
Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Td2a8ffmark_conversation_readTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3source_hashTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4) Tff7b72in Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTb4b4b4:
Te6edf3nomadnetTff7b72.Td2a8ffConversationTff7b72.Td2a8ffunread_conversationsTff7b72.Td2a8ffpopTb4b4b4(Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3source_hashTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3source_hash Tff7b72+ Ta5d6ff"Ta5d6ff/unreadTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconversationpath Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3source_hash Tff7b72+ Ta5d6ff"Ta5d6ff/unreadTa5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffnotify_message_recievedTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72== Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_TEXTTb4b4b4:
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Tffea00\aTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffclear_tmp_dirTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fftmpfilespathTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3file Tff7b72in Te6edf3osTff7b72.Td2a8fflistdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fftmpfilespathTb4b4b4)Tb4b4b4:
Te6edf3fpath Tff7b72= Tff7b72selfTff7b72.Td2a8fftmpfilespathTff7b72+Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72+Te6edf3file
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3fpathTb4b4b4)

Tff7b72def Td2a8ffcreateDefaultConfigTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfig Tff7b72= Te6edf3ConfigObjTb4b4b4(Te6edf3__default_nomadnet_config__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8fffilename Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigpath

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigdirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconfigTff7b72.Td2a8ffwriteTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffapplyConfigTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8ffapplyConfigTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffloggingTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffloglevelTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= Tffa657intTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff0
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72> T79c0ff7Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffloglevel Tff7b72= T79c0ff7
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4:
Tff7b72if Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fffileTa5d6ff" Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffforce_console_logTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_FILE
Tff7b72if Ta5d6ff"Ta5d6fflogfileTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflogfilepath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffloggingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflogfileTa5d6ff"Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogfile Tff7b72= Tff7b72selfTff7b72.Td2a8fflogfilepath
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogdest Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_STDOUT

Tff7b72if Ta5d6ff"Ta5d6ffclientTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffenable_clientTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffenable_client Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffdownloads_pathTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdownloads_pathTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffdownloads_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3valueTb4b4b4)

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffattachment_save_pathTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffattachment_save_pathTa5d6ff"Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffattachment_save_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Te6edf3valueTb4b4b4)

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeer_announce_at_start Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff30Tb4b4b4: Te6edf3value Tff7b72= T79c0ff30
Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72= Te6edf3valueTff7b72*T79c0ff60

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fftry_propagation_on_send_failTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftry_propagation_on_fail Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffperiodic_lxmf_syncTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffperiodic_lxmf_sync Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflxmf_sync_intervalTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)Tff7b72*T79c0ff60

Tff7b72if Te6edf3value Tff7b72>Tff7b72= T79c0ff60Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_interval Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6fflxmf_sync_limitTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)

Tff7b72if Te6edf3value Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_sync_limit Tff7b72= Tff7b72None

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffrequired_stamp_costTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tb4b4b4[Te6edf3optionTb4b4b4]
Tff7b72if Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequired_stamp_cost Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)

Tff7b72if Te6edf3value Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3value Tff7b72> T79c0ff255Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff255
Tff7b72selfTff7b72.Td2a8ffrequired_stamp_cost Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrequired_stamp_cost Tff7b72= Tff7b72None

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffaccept_invalid_stampsTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffaccept_invalid_stamps Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffmax_accepted_sizeTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Te6edf3optionTb4b4b4)

Tff7b72if Te6edf3value Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_max_incoming_size Tff7b72= Te6edf3value
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_max_incoming_size Tff7b72= T79c0ff500

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffcompact_announce_streamTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcompact_stream Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffnotify_on_new_messageTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffclientTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnotify_on_new_message Tff7b72= Te6edf3value

Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffuser_interfaceTa5d6ff"Tb4b4b4:
Te6edf3value Tff7b72= Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_NONE
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffmenuTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_MENU
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_TEXT
Tff7b72if Ta5d6ff"Ta5d6fftextuiTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffintro_timeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffintro_timeTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffintro_textTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffintro_textTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffNomad NetworkTa5d6ff"

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffeditorTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffeditorTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffnanoTa5d6ff"

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffglyphsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffglyphsTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ffunicodeTa5d6ff"

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffmouse_enabledTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffhide_guideTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffhide_guideTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffsanitize_namesTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsanitize_namesTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsanitize_namesTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffsanitize_namesTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff1
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffanimation_intervalTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffcolormodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffCOLORMODE_16
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffmonochromeTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_MONO
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff16Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_16
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff88Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_88
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff256Ta5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_256
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ff24bitTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffcolormodeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffCOLORMODE_TRUE
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe selected Text UI color mode is invalidTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffthemeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_DARK
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffdarkTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_DARK
Tff7b72elif Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fflightTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6fftextuiTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffthemeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffTextUITff7b72.Td2a8ffTHEME_LIGHT
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffThe selected Text UI theme is invalidTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149KeyErrorTb4b4b4(Ta5d6ff"Ta5d6ffText UI selected in configuration file, but no [textui] section foundTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffgraphicalTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_GRAPHICAL
Tff7b72if Te6edf3value Tff7b72== Ta5d6ff"Ta5d6ffwebTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffuimode Tff7b72= Te6edf3nomadnetTff7b72.Td2a8ffuiTff7b72.Td2a8ffUI_WEB

Tff7b72if Ta5d6ff"Ta5d6ffrrcTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72for Te6edf3option Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffrrcTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3option Tff7b72== Ta5d6ff"Ta5d6ffhistory_per_room_capTa5d6ff"Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffrrcTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Te6edf3optionTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3value Tff7b72= Tff7b72None
Tff7b72if Te6edf3value Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3value Tff7b72>Tff7b72= T79c0ff0Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrrc_history_per_room_cap Tff7b72= Te6edf3value

Tff7b72if Ta5d6ff"Ta5d6ffnodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffenable_node Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffenable_nodeTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffnode_nameTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4]
Tff7b72if Te6edf3valueTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffnoneTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnode_nameTa5d6ff"Tb4b4b4]

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffdisable_propagationTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisable_propagation Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdisable_propagation Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffdisable_propagationTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmax_transfer_sizeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_size Tff7b72= T79c0ff256
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmax_transfer_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_size Tff7b72= Te6edf3value

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmax_sync_sizeTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflxmf_max_sync_size Tff7b72= T79c0ff256Tff7b72*T79c0ff40
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmax_sync_sizeTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_sizeTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8fflxmf_max_propagation_size
Tff7b72selfTff7b72.Td2a8fflxmf_max_sync_size Tff7b72= Te6edf3value

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_announce_at_start Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffannounce_at_startTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnode_announce_at_start Tff7b72= Te6edf3value

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_announce_interval Tff7b72= T79c0ff720
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffannounce_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffnode_announce_interval Tff7b72= Te6edf3value

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffpropagation_costTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffnode_propagation_cost Tff7b72= T79c0ff16
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffpropagation_costTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff13Tb4b4b4: Te6edf3value Tff7b72= T79c0ff13
Tff7b72selfTff7b72.Td2a8ffnode_propagation_cost Tff7b72= Te6edf3value

Tff7b72if Ta5d6ff"Ta5d6ffpages_pathTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpagespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpages_pathTa5d6ff"Tb4b4b4]

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffpage_refresh_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpage_refresh_interval Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffpage_refresh_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffpage_refresh_interval Tff7b72= Te6edf3value


Tff7b72if Ta5d6ff"Ta5d6fffiles_pathTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffilespath Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fffiles_pathTa5d6ff"Tb4b4b4]

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6fffile_refresh_intervalTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fffile_refresh_interval Tff7b72= T79c0ff0
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6fffile_refresh_intervalTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fffile_refresh_interval Tff7b72= Te6edf3value


Tff7b72if Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinations Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffprioritise_destinationsTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprioritised_lxmf_destinations Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72if Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatic_peers Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffstatic_peersTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatic_peers Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmax_peersTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmax_peers Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_intTb4b4b4(Ta5d6ff"Ta5d6ffmax_peersTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffmax_peers Tff7b72= Te6edf3value

Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmessage_storage_limit Tff7b72= T79c0ff2000
Tff7b72elseTb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_floatTb4b4b4(Ta5d6ff"Ta5d6ffmessage_storage_limitTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3value Tff7b72< T79c0ff0.005Tb4b4b4:
Te6edf3value Tff7b72= T79c0ff0.005
Tff7b72selfTff7b72.Td2a8ffmessage_storage_limit Tff7b72= Te6edf3value

Tff7b72selfTff7b72.Td2a8ffprint_command Tff7b72= Ta5d6ff"Ta5d6fflpTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffprint_messages Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprint_all_messages Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprint_trusted_messages Tff7b72= Tff7b72False
Tff7b72if Ta5d6ff"Ta5d6ffprintingTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffprint_messagesTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_messages Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_messages Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffprint_messagesTa5d6ff"Tb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffprint_commandTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_command Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_commandTa5d6ff"Tb4b4b4]

Tff7b72if Tff7b72selfTff7b72.Td2a8ffprint_messagesTb4b4b4:
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffprint_fromTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinations Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Tffa657strTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinations Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffeverywhereTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_all_messages Tff7b72= Tff7b72True

Tff7b72if Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftrustedTa5d6ff"Tb4b4b4:

Tff7b72selfTff7b72.Td2a8ffprint_all_messages Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffprint_trusted_messages Tff7b72= Tff7b72True

Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinationsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tb4b4b4)

Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Tffa657listTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinations Tff7b72= Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffprint_fromTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3allowed_entry Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_message_print_destinationsTb4b4b4:
Tff7b72if Te6edf3allowed_entryTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftrustedTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprint_trusted_messages Tff7b72= Tff7b72True


Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmessage_templateTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprinting_template_msg Tff7b72= Te6edf3__printing_template_msg__
Tff7b72elseTb4b4b4:
Te6edf3mt_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexpanduserTb4b4b4(Tff7b72selfTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffprintingTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmessage_templateTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3mt_pathTb4b4b4)Tb4b4b4:
Te6edf3template_file Tff7b72= Tffa657openTb4b4b4(Te6edf3mt_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprinting_template_msg Tff7b72= Te6edf3template_fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3template_file Tff7b72= Tffa657openTb4b4b4(Te6edf3mt_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4)
Te6edf3template_fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3__printing_template_msg__Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffprinting_template_msg Tff7b72= Te6edf3__printing_template_msg__


Tf0883e@staticmethod
Tff7b72def Td2a8ffget_shared_instanceTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3NomadNetworkAppTff7b72.Td2a8ff_shared_instance
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149UnboundLocalErrorTb4b4b4(Ta5d6ff"Ta5d6ffNo Nomad Network applications have been instantiated yetTa5d6ff"Tb4b4b4)


Tff7b72def Td2a8ffquitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNomad Network Client shutting down...Ta5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ff_exitTb4b4b4(T79c0ff0Tb4b4b4)


T8b949e# Default configuration file:
Te6edf3__default_nomadnet_config__ Tff7b72= Ta5d6ff'''Ta5d6ff# This is the default Nomad Network config file.
Ta5d6ff# You should probably edit it to suit your needs and use-case,

Ta5d6ff[logging]
Ta5d6ff# Valid log levels are 0 through 7:
Ta5d6ff# 0: Log only critical information
Ta5d6ff# 1: Log errors and lower log levels
Ta5d6ff# 2: Log warnings and lower log levels
Ta5d6ff# 3: Log notices and lower log levels
Ta5d6ff# 4: Log info and lower (this is the default)
Ta5d6ff# 5: Verbose logging
Ta5d6ff# 6: Debug logging
Ta5d6ff# 7: Extreme logging

Ta5d6ffloglevel = 4
Ta5d6ffdestination = file

Ta5d6ff[client]

Ta5d6ffenable_client = yes
Ta5d6ffuser_interface = text
Ta5d6ffdownloads_path = ~/Downloads

Ta5d6ff# Where to save received attachments. If not set,
Ta5d6ff# attachments will be saved to the downloads path.
Ta5d6ff# attachment_save_path = ~/Downloads

Ta5d6ffnotify_on_new_message = yes

Ta5d6ff# By default, the peer is announced at startup
Ta5d6ff# to let other peers reach it immediately.
Ta5d6ffannounce_at_start = yes

Ta5d6ff# Automatic announce interval in minutes for
Ta5d6ff# your LXMF address. 6 hours by default.
Ta5d6ffannounce_interval = 360

Ta5d6ff# By default, the client will try to deliver a
Ta5d6ff# message via the LXMF propagation network, if
Ta5d6ff# a direct delivery to the recipient is not
Ta5d6ff# possible.
Ta5d6fftry_propagation_on_send_fail = yes

Ta5d6ff# Nomadnet will periodically sync messages from
Ta5d6ff# LXMF propagation nodes by default, if any are
Ta5d6ff# present. You can disable this if you want to
Ta5d6ff# only sync when manually initiated.
Ta5d6ffperiodic_lxmf_sync = yes

Ta5d6ff# The sync interval in minutes. This value is
Ta5d6ff# equal to 6 hours (360 minutes) by default.
Ta5d6fflxmf_sync_interval = 360

Ta5d6ff# By default, automatic LXMF syncs will only
Ta5d6ff# download 8 messages at a time. You can change
Ta5d6ff# this number, or set the option to 0 to disable
Ta5d6ff# the limit, and download everything every time.
Ta5d6fflxmf_sync_limit = 8

Ta5d6ff# You can specify a required stamp cost for
Ta5d6ff# inbound messages to be accepted. Specifying
Ta5d6ff# a stamp cost will require untrusted senders
Ta5d6ff# that message you to include a cryptographic
Ta5d6ff# stamp in their messages. Performing this
Ta5d6ff# operation takes the sender an amount of time
Ta5d6ff# proportional to the stamp cost. As a rough
Ta5d6ff# estimate, a stamp cost of 8 will take less
Ta5d6ff# than a second to compute, and a stamp cost
Ta5d6ff# of 20 could take several minutes, even on
Ta5d6ff# a fast computer.
Ta5d6ffrequired_stamp_cost = None

Ta5d6ff# You can signal stamp requirements to senders,
Ta5d6ff# but still accept messages with invalid stamps
Ta5d6ff# by setting this option to True.
Ta5d6ffaccept_invalid_stamps = False

Ta5d6ff# The maximum accepted unpacked size for mes-
Ta5d6ff# sages received directly from other peers,
Ta5d6ff# specified in kilobytes. Messages larger than
Ta5d6ff# this will be rejected before the transfer
Ta5d6ff# begins.
Ta5d6ffmax_accepted_size = 500

Ta5d6ff# The announce stream will only show one entry
Ta5d6ff# per destination or node by default. You can
Ta5d6ff# change this to show as many announces as have
Ta5d6ff# been received, for every destination.
Ta5d6ffcompact_announce_stream = yes

Ta5d6ff[textui]

Ta5d6ff# Amount of time to show intro screen
Ta5d6ffintro_time = 1

Ta5d6ff# You can specify the display theme.
Ta5d6ff# theme = light
Ta5d6fftheme = dark

Ta5d6ff# Specify the number of colors to use
Ta5d6ff# valid colormodes are:
Ta5d6ff# monochrome, 16, 88, 256 and 24bit
Ta5d6ff#
Ta5d6ff# The default is a conservative 256 colors.
Ta5d6ff# If your terminal does not support this,
Ta5d6ff# you can lower it. Some terminals support
Ta5d6ff# 24 bit color.

Ta5d6ff# colormode = monochrome
Ta5d6ff# colormode = 16
Ta5d6ff# colormode = 88
Ta5d6ff# colormode = 256
Ta5d6ffcolormode = 24bit

Ta5d6ff# By default, unicode glyphs are used. If
Ta5d6ff# you have a Nerd Font installed, you can
Ta5d6ff# enable this for a better user interface.
Ta5d6ff# You can also enable plain text glyphs if
Ta5d6ff# your terminal doesnTa5d6ff'Ta5d6fft support unicode.

Ta5d6ff# glyphs = plain
Ta5d6ff# glyphs = unicode
Ta5d6ffglyphs = nerdfont

Ta5d6ff# You can specify whether mouse events
Ta5d6ff# should be considered as input to the
Ta5d6ff# application. On by default.
Ta5d6ffmouse_enabled = True

Ta5d6ff# What editor to use for editing text.
Ta5d6ffeditor = nano

Ta5d6ff# If you donTa5d6ff'Ta5d6fft want the Guide section to
Ta5d6ff# show up in the menu, you can disable it.
Ta5d6ffhide_guide = no

Ta5d6ff# You can select whether or not to perform
Ta5d6ff# text sanitization on names received in
Ta5d6ff# announces.
Ta5d6ffsanitize_names = yes

Ta5d6ff[rrc]

Ta5d6ff# Maximum number of messages retained per
Ta5d6ff# room in the in-memory scrollback buffer,
Ta5d6ff# and the number of messages restored from
Ta5d6ff# on-disk history at startup. The on-disk
Ta5d6ff# log itself is appended to indefinitely;
Ta5d6ff# this cap only controls how much backlog
Ta5d6ff# is visible. Set to 0 to keep every message
Ta5d6ff# in memory (full history).
Ta5d6ffhistory_per_room_cap = 500

Ta5d6ff[node]

Ta5d6ff# Whether to enable node hosting
Ta5d6ffenable_node = no

Ta5d6ff# The node name will be visible to other
Ta5d6ff# peers on the network, and included in
Ta5d6ff# announces.
Ta5d6ffnode_name = None

Ta5d6ff# Automatic announce interval in minutes.
Ta5d6ff# 6 hours by default.
Ta5d6ffannounce_interval = 360

Ta5d6ff# Whether to announce when the node starts.
Ta5d6ffannounce_at_start = Yes

Ta5d6ff# When Nomad Network is hosting a page-serving
Ta5d6ff# node, it can also act as an LXMF propagation
Ta5d6ff# node. This is a convenient feature that lets
Ta5d6ff# you easily set up and run a propagation node
Ta5d6ff# on the network, but it is not as fully
Ta5d6ff# featured as using the lxmd program to host a
Ta5d6ff# propagation node. For complete control and
Ta5d6ff# flexibility, use lxmd to run a PN. For a
Ta5d6ff# small local system or network, the built-in
Ta5d6ff# PN functionality will suffice for most cases.
Ta5d6ff#
Ta5d6ff# If there is already a large amount of
Ta5d6ff# propagation nodes on the network, or you
Ta5d6ff# simply want to run a pageserving-only node,
Ta5d6ff# you should disable running a propagation node.
Ta5d6ff# Due to lots of propagation nodes being
Ta5d6ff# available, this is currently the default.

Ta5d6ffdisable_propagation = Yes

Ta5d6ff# For clients and other propagation nodes
Ta5d6ff# delivering messages via this node, you can
Ta5d6ff# configure the minimum required propagation
Ta5d6ff# stamp costs. All messages delivered to the
Ta5d6ff# propagation node network must have a valid
Ta5d6ff# propagation stamp, or they will be rejected.
Ta5d6ff# Clients automatically detect the stamp cost
Ta5d6ff# for the node they are delivering to, and
Ta5d6ff# compute a corresponding stamp before trying
Ta5d6ff# to deliver the message to the propagation
Ta5d6ff# node.
Ta5d6ff#
Ta5d6ff# Propagation stamps are easier to verify in
Ta5d6ff# large batches, and therefore also somewhat
Ta5d6ff# easier to compute for the senders. As such,
Ta5d6ff# a reasonable propagation stamp cost should
Ta5d6ff# be a bit higher than the normal peer-to-peer
Ta5d6ff# stamp costs.
Ta5d6ff#
Ta5d6ff# Propagation stamps does not incur any extra
Ta5d6ff# load for propagation nodes processing them,
Ta5d6ff# since they are only required to verify that
Ta5d6ff# they are correct, and only the generation
Ta5d6ff# is computationally costly. Setting a sensible
Ta5d6ff# propagation stamp cost (and periodically
Ta5d6ff# checking the average network consensus) helps
Ta5d6ff# keep spam and misuse out of the propagation
Ta5d6ff# node network.

Ta5d6ffpropagation_cost = 16

Ta5d6ff# The maximum amount of storage to use for
Ta5d6ff# the LXMF Propagation Node message store,
Ta5d6ff# specified in megabytes. When this limit
Ta5d6ff# is reached, LXMF will periodically remove
Ta5d6ff# messages in its message store. By default,
Ta5d6ff# LXMF prioritises keeping messages that are
Ta5d6ff# new and small. Large and old messages will
Ta5d6ff# be removed first. This setting is optional
Ta5d6ff# and defaults to 2 gigabytes.

Ta5d6ff# message_storage_limit = 2000

Ta5d6ff# The maximum accepted transfer size per in-
Ta5d6ff# coming propagation message, in kilobytes.
Ta5d6ff# This sets the upper limit for the size of
Ta5d6ff# single messages accepted onto this node.

Ta5d6ffmax_transfer_size = 256

Ta5d6ff# The maximum accepted transfer size per in-
Ta5d6ff# coming propagation node sync.
Ta5d6ff#
Ta5d6ff# If a node wants to propagate a larger number
Ta5d6ff# of messages to this node, than what can fit
Ta5d6ff# within this limit, it will prioritise sending
Ta5d6ff# the smallest messages first, and try again
Ta5d6ff# with any remaining messages at a later point.

Ta5d6ffmax_sync_size = 10240

Ta5d6ff# You can tell the LXMF message router to
Ta5d6ff# prioritise storage for one or more
Ta5d6ff# destinations. If the message store reaches
Ta5d6ff# the specified limit, LXMF will prioritise
Ta5d6ff# keeping messages for destinations specified
Ta5d6ff# with this option. This setting is optional,
Ta5d6ff# and generally you do not need to use it.

Ta5d6ff# prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf

Ta5d6ff# You can configure the maximum number of other
Ta5d6ff# propagation nodes that this node will peer
Ta5d6ff# with automatically. The default is 20.

Ta5d6ff# max_peers = 20

Ta5d6ff# You can configure a list of static propagation
Ta5d6ff# node peers, that this node will always be
Ta5d6ff# peered with, by specifying a list of
Ta5d6ff# destination hashes.

Ta5d6ff# static_peers = e17f833c4ddf8890dd3a79a6fea8161d, 5a2d0029b6e5ec87020abaea0d746da4

Ta5d6ff# You can specify the interval in minutes for
Ta5d6ff# rescanning the hosted pages path. By default,
Ta5d6ff# this option is disabled, and the pages path
Ta5d6ff# will only be scanned on startup.

Ta5d6ff# page_refresh_interval = 0

Ta5d6ff# You can specify the interval in minutes for
Ta5d6ff# rescanning the hosted files path. By default,
Ta5d6ff# this option is disabled, and the files path
Ta5d6ff# will only be scanned on startup.

Ta5d6ff# file_refresh_interval = 0

Ta5d6ff[printing]

Ta5d6ff# You can configure Nomad Network to print
Ta5d6ff# various kinds of information and messages.

Ta5d6ff# Printing messages is disabled by default

Ta5d6ffprint_messages = No

Ta5d6ff# You can configure a custom template for
Ta5d6ff# message printing. If you uncomment this
Ta5d6ff# option, set a path to the template and
Ta5d6ff# restart Nomad Network, a default template
Ta5d6ff# will be created that you can edit.

Ta5d6ff# message_template = ~/.nomadnetwork/print_template_msg.txt

Ta5d6ff# You can configure Nomad Network to only
Ta5d6ff# print messages from trusted destinations.

Ta5d6ff# print_from = trusted

Ta5d6ff# Or specify the source LXMF addresses that
Ta5d6ff# will automatically have messages printed
Ta5d6ff# on arrival.

Ta5d6ff# print_from = 76fe5751a56067d1e84eef3e88eab85b, 0e70b5848eb57c13154154feaeeb89b7

Ta5d6ff# Or allow printing from anywhere, if you
Ta5d6ff# are feeling brave and adventurous.

Ta5d6ff# print_from = everywhere

Ta5d6ff# You can configure the printing command.
Ta5d6ff# This will use the default CUPS printer on
Ta5d6ff# your system.

Ta5d6ffprint_command = lp

Ta5d6ff# You can specify what printer to use
Ta5d6ff# print_command = lp -d [PRINTER_NAME]

Ta5d6ff# Or specify more advanced options. This
Ta5d6ff# example works well for small thermal-
Ta5d6ff# roll printers:
Ta5d6ff# print_command = lp -d [PRINTER_NAME] -o cpi=16 -o lpi=8

Ta5d6ff# This one is more suitable for full-sheet
Ta5d6ff# printers. It will print a QR code at the center of any media
Ta5d6ff# your printer will accept, print in portrait mode, and move the message to
Ta5d6ff# the top of the print queue:
Ta5d6ff# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=Custom.75x75mm -o orientation-requested=3

Ta5d6ff# But you can modify the size to fit your needs.
Ta5d6ff# The custom media option accepts millimeters, centimeters, and
Ta5d6ff# inches in a width by length format like so:
Ta5d6ff# -o media=Custom.[WIDTH]x[LENGTH][mm,cm,in]
Ta5d6ff#
Ta5d6ff# The job priority option accepts 1-100, though you can remove it
Ta5d6ff# entirely if you arenTa5d6ff'Ta5d6fft concerned with a print queue:
Ta5d6ff# -o job-priority=[1-100]
Ta5d6ff#
Ta5d6ff# Finally, the orientation option allows for 90 degree rotations beginning with 3, so:
Ta5d6ff# -o orientation-requested=4 (landscape, 90 degrees)
Ta5d6ff# -o orientation-requested=5 (reverse portrait, 180 degrees)
Ta5d6ff#
Ta5d6ff# Here is the full command with the recommended customizable variables:
Ta5d6ff# print_command = lp -d [PRINTER_NAME] -o job-priority=[N] -o media=[MEDIA_SIZE] -o orientation-requested=[N] -o sides=one-sided

Ta5d6ff# For example, hereTa5d6ff'Ta5d6ffs a configuration for USB thermal printer that uses the POS-58 PPD driver
Ta5d6ff# with rolls 47.98x209.9mm in size:
Ta5d6ff# print_command = lp -d [PRINTER_NAME] -o job-priority=100 -o media=custom_47.98x209.9mm_47.98x209.9mm -o sides=one-sided

Ta5d6ff'''Tff7b72.Td2a8ffsplitlinesTb4b4b4(Tb4b4b4)

Te6edf3__printing_template_msg__ Tff7b72= Ta5d6ff"""
Ta5d6ff---------------------------
Ta5d6ffFrom: Tffd700{origin}
Ta5d6ffSent: Tffd700{stime}
Ta5d6ffRcvd: Tffd700{rtime}
Ta5d6ffTitle: Tffd700{mtitle}

Tffd700{mbody}
Ta5d6ff---------------------------
Ta5d6ff"""


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────